package cn.qdhlm.collectservice.core.component.command;

import cn.qdhlm.collectservice.common.util.CodeUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;

/**
 * @Name: CmdCom
 * @Description: CmdCom
 * @Author: jiangcs
 */
public class CmdCom {
    /**
     * 组包
     *
     * @param macAddr
     * @param codeCustomNB
     * @param byteBufDataBody
     * @return
     */
    public static ByteBuf pack(String macAddr, int codeCustomNB, ByteBuf byteBufDataBody) {
        ByteBuf byteBufDataHead = packDataHead(macAddr, codeCustomNB);
        ByteBuf byteBufData = Unpooled.wrappedBuffer(byteBufDataHead, byteBufDataBody);
        ByteBuf byteBufHead = packHead(byteBufData);
        ByteBuf byteBufTail = packTail(byteBufData);
        return Unpooled.wrappedBuffer(byteBufHead, byteBufData, byteBufTail);
    }

    /**
     * 组包：头部
     *
     * @param byteBufData
     * @return
     */
    private static ByteBuf packHead(ByteBuf byteBufData) {
        ByteBuf byteBuf = Unpooled.buffer(4);
        byteBuf.writeByte(0x68);
        byteBuf.writeShortLE(byteBufData.readableBytes());
        byteBuf.writeByte(0x68);
        return byteBuf;
    }

    /**
     * 组包：用户数据区 头部
     *
     * @param macAddr
     * @param codeCustomNB
     * @return
     */
    private static ByteBuf packDataHead(String macAddr, int codeCustomNB) {
        ByteBuf byteBuf = Unpooled.buffer(6);
        // 控制码 40：0100 0000
        byteBuf.writeByte(0x40);
        // 协议ID
        byteBuf.writeByte(codeCustomNB);
        // 地址域,4字节
        byteBuf.writeBytes(CodeUtil.hexStringToByteArray(macAddr));
        return byteBuf;
    }

    /**
     * 组包：尾部
     *
     * @param byteBufData
     * @return
     */
    private static ByteBuf packTail(ByteBuf byteBufData) {
        ByteBuf byteBuf = Unpooled.buffer(2);
        int sum = 0;
        for (int i = 0, len = byteBufData.readableBytes(); i < len; i++) {
            sum += byteBufData.getByte(i);
        }
        byteBuf.writeByte(sum % 256);
        byteBuf.writeByte(0x16);
        return byteBuf;
    }
}
